package iWish_Activity;
//**Alessandro*//
import java.text.SimpleDateFormat;
import java.util.TimeZone;
import iWish_Activities.Activities;
import iWish_Bluetooth.BluetoothLeService;
import iWish_Control.ControlConnection;
import iWish_Control.ControlSession;
import iWish_Session.Session;
import android.widget.ImageButton;
import android.app.Activity;
import android.bluetooth.BluetoothGattCharacteristic;
import android.bluetooth.BluetoothGattService;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.SystemClock;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Chronometer;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Chronometer.OnChronometerTickListener;
import com.progect.iwish.R;
//utilizzato prima nel tasto disconect per disconnettersi richiama in BluetoothLeService il disconnect dal server gatt
//mBluetoothLeService.disconnect();
public class ProgressActivity extends Activity{
private Button heartRate;
//private ImageButton menu;
private ImageButton ok;
private ImageButton stop;
private ImageButton done;
private Button pause;
private final static String TAG = ProgressActivity.class.getSimpleName();
public static final String EXTRAS_DEVICE_NAME = "DEVICE_NAME";
public static final String EXTRAS_DEVICE_ADDRESS = "DEVICE_ADDRESS";
private static final long START_HEART = 2000; //Start heart
private String mDeviceAddress;
private BluetoothLeService mBluetoothLeService;
private boolean mConnected = false;
private BluetoothGattCharacteristic mNotifyCharacteristic;
private Handler mHandler;
private Activities mActivities;
private ImageView going;
private Chronometer ch;
private long milliseconds;
private SimpleDateFormat timeFormat;
private String hmmss;
private TextView heartMax;
private TextView heartMin;
private TextView heartMed;
private boolean mStarting;
private Button mGraphic;
private boolean staticGraphic;
private int tempoStatico;
private boolean setBLE;
private Session mSession;
// Code to manage Service lifecycle.
private final ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder service) {
mBluetoothLeService = ((BluetoothLeService.LocalBinder) service).getService();
if (!mBluetoothLeService.initialize()) {
Log.e(TAG, "Unable to initialize Bluetooth");
finish();
}
// Automatically connects to the device upon successful start-up initialization.
mBluetoothLeService.connect(mDeviceAddress);
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
mBluetoothLeService = null;
}
};
// Handles various events fired by the Service.
// ACTION_GATT_CONNECTED: connected to a GATT server.
// ACTION_GATT_DISCONNECTED: disconnected from a GATT server.
// ACTION_GATT_SERVICES_DISCOVERED: discovered GATT services.
// ACTION_DATA_AVAILABLE: received data from the device. This can be a result of read
// or notification operations.
private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (BluetoothLeService.ACTION_GATT_CONNECTED.equals(action)) {
mConnected = true;
//posso sostituirlo con qualche avviso di connessione al BLE
//updateConnectionState(R.string.connected);
}
else if (BluetoothLeService.ACTION_GATT_DISCONNECTED.equals(action)) {
mConnected = false;
//posso sostituirlo con qualche avviso di disconnessione al BLE
//updateConnectionState(R.string.disconnected);
//aggiornava l'attuale testo dei battiti che sono ora in heartRate
//mDataField.setText(R.string.no_data);
heartRate.setText("--");
}
else if (BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED.equals(action)) {
// Show all the supported services and characteristics on the user interface.
//non pi� utilizzato non metto a video tutti i servizi
}
else if (BluetoothLeService.ACTION_DATA_AVAILABLE.equals(action)) {
//qui viene inviato alla TextView il dato aggiornato dei battiti cardiaci che ora si chiama heartRate
displayData(intent.getStringExtra(BluetoothLeService.EXTRA_DATA),intent.getStringExtra(BluetoothLeService.EXTRA_MAX),
intent.getStringExtra(BluetoothLeService.EXTRA_MIN),
intent.getStringExtra(BluetoothLeService.EXTRA_MED));
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.progress);
mHandler = new Handler();
mStarting = false;
setBLE = false;
staticGraphic = false;
tempoStatico =0;
final Intent intent = getIntent();
mDeviceAddress = intent.getStringExtra(EXTRAS_DEVICE_ADDRESS);
mActivities = (Activities) intent.getSerializableExtra("a");
going = (ImageView)findViewById(R.id.going);
heartMax =(TextView)findViewById(R.id.heart_max);
heartMin =(TextView)findViewById(R.id.heart_min);
heartMed =(TextView)findViewById(R.id.heart_med);
//menu = (ImageButton)findViewById(R.id.bott_omino);
mGraphic = (Button) findViewById(R.id.graphic);
ok = (ImageButton)findViewById(R.id.m_lets_start);
stop = (ImageButton) findViewById(R.id.m_stop);
pause = (Button) findViewById(R.id.pause);
done = (ImageButton) findViewById(R.id.m_done_prog);
stop.setVisibility(View.INVISIBLE);
pause.setVisibility(View.INVISIBLE);
done.setVisibility(View.INVISIBLE);
heartRate = (Button)findViewById(R.id.heart_rate);
if(mDeviceAddress != null){
Intent gattServiceIntent = new Intent(this, BluetoothLeService.class);
bindService(gattServiceIntent, mServiceConnection, BIND_AUTO_CREATE);
}
milliseconds =0;
ch = (Chronometer) findViewById(R.id.chronometer);
timeFormat = new SimpleDateFormat("H:mm:ss");
timeFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
hmmss = timeFormat.format(milliseconds);
ch.setText(hmmss);
setOnClickButton();
setOnChronometer();
setImage();
// Start heartRate.
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
startHeart();
}
}, START_HEART);
}
@Override
protected void onResume() {
super.onResume();
registerReceiver(mGattUpdateReceiver, makeGattUpdateIntentFilter());
if (mBluetoothLeService != null && mDeviceAddress != null) {
final boolean result = mBluetoothLeService.connect(mDeviceAddress);
Log.d(TAG, "Connect request result=" + result);
}
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(mGattUpdateReceiver);
}
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(mServiceConnection);
mBluetoothLeService = null;
}
@Override
public void onBackPressed() {
// your code.
//Intent intent3 = new Intent(ProgressActivity.this, ProfileActivity.class );------------
//eventuale uso adesso non serve
//intent3.putExtra("a", mActivities);
//startActivity(intent3);----------------
//finish();
}
private void updateConnectionState(final int resourceId) {
runOnUiThread(new Runnable() {
@Override
public void run() {
//textView che non c'� pi� aggiornata in caso di connessione utile per altre azioni alla connessione
//mConnectionState.setText(resourceId);
}
});
}
//aggiorna i battiti cardiaci
private void displayData(String data, String max, String min, String med) {
if (data != null) {
//vecchi dato che aggiornava i battiti adesso heartRate
//mDataField.setText(data);
heartRate.setText(data);
if(mStarting){
// MinMaxMed(data);
heartMax.setText(max);
heartMin.setText(min);
heartMed.setText(med);
}
}
}
private static IntentFilter makeGattUpdateIntentFilter() {
final IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(BluetoothLeService.ACTION_GATT_CONNECTED);
intentFilter.addAction(BluetoothLeService.ACTION_GATT_DISCONNECTED);
intentFilter.addAction(BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED);
intentFilter.addAction(BluetoothLeService.ACTION_DATA_AVAILABLE);
return intentFilter;
}
private void setOnClickButton(){
/* menu.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//da controllare come ritornare al menu
//startActivity(new Intent(ProgressActivity.this, ProfileActivity.class ));
milliseconds = SystemClock.elapsedRealtime() - ch.getBase();
ch.stop();
}
});*/
ok.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//da definire cosa fa allo start Let's Start
if(mBluetoothLeService!=null){
mBluetoothLeService.setActivitiesAndSession(mActivities);
mBluetoothLeService.onStart();
}
else{
//gestire il caso senza bluetooth di session e di activities
mSession = new Session();
mSession.setKeyActivities(mActivities.getKeyActivities());
mSession.setStartDateActivities(mActivities.getStartDate());
long tempo = System.currentTimeMillis();
int startDateTime = (int) (tempo/1000);
mSession.setStartDate(startDateTime);
}
mStarting = true;
setBLE = true;
ok.setVisibility(View.INVISIBLE);
stop.setVisibility(View.VISIBLE);
pause.setVisibility(View.VISIBLE);
ch.setBase(SystemClock.elapsedRealtime() - milliseconds);
ch.start();
}
});
stop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//da definire cosa fa stop
if(mBluetoothLeService!=null){
mBluetoothLeService.onStop();
staticGraphic = true;
}
else{
int durataTempo = (int) (SystemClock.elapsedRealtime() - ch.getBase())/1000;
if(!mStarting){
ch.setBase(SystemClock.elapsedRealtime() - milliseconds);
durataTempo =(int) (SystemClock.elapsedRealtime() - ch.getBase())/1000;
ch.start();
ch.stop();
}
mSession.setDurataTempo(durataTempo);
try {
Log.i("BluetoothLeService", "PRIMA DI INSERIRE NEL DB SESSION");
ControlSession.getIstanceControlSession().saveOnDbSession(mSession, getApplicationContext());
Log.i("BluetoothLeService", "DOPO L'INSERIMENTO NEL DB SESSION");
ControlConnection.getIstanceControlConnection().onInsertSession("0,0");
Log.i("BluetoothLeService", "DOPO L'INSERIMENTO online");
} catch (Exception e) {
//Toast.makeText(c ,"errore di salvataggio", Toast.LENGTH_LONG).show();
Log.i("BluetoothLeService", "errore INSERIMENTO NEL DB SESSION");
e.printStackTrace();
}
Log.i("WeightActivity", "SALVATAGGIO SUL DB ANDATO A BUON FINE");
}
ch.stop();
pause.setVisibility(View.INVISIBLE);
stop.setVisibility(View.INVISIBLE);
done.setVisibility(View.VISIBLE);
mStarting = false;
tempoStatico =(int) (SystemClock.elapsedRealtime() - ch.getBase())/1000;
}
});
pause.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//da definire cosa fa pause
if(mStarting){
milliseconds = SystemClock.elapsedRealtime() - ch.getBase();
ch.stop();
mStarting= false;
tempoStatico =(int) (SystemClock.elapsedRealtime() - ch.getBase())/1000;
if(mBluetoothLeService!=null){
mBluetoothLeService.onPause();
staticGraphic = true;
}
}
else{
ch.setBase(SystemClock.elapsedRealtime() - milliseconds);
ch.start();
mStarting = true;
if(mBluetoothLeService!=null){
mBluetoothLeService.onPause();
staticGraphic = false;
}
}
}
});
done.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//da definire cosa fa pause
if(mBluetoothLeService!=null){
mBluetoothLeService.disconnect();
}
Intent intent3 = new Intent(ProgressActivity.this, ProfileActivity.class );
//eventuale uso adesso non serve
//intent3.putExtra("a", mActivities);
startActivity(intent3);
//finish();
}
});
heartRate.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(!mStarting && !setBLE){
// selezione del dispositivo bluetooth
Intent intent2 = new Intent(ProgressActivity.this, BluetoothActivity.class );
intent2.putExtra("a", mActivities);
startActivity(intent2);
}
}
});
mGraphic.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(staticGraphic||(mStarting && mBluetoothLeService!=null)){
// visualizza grafico
int tempoPassato =(int) (SystemClock.elapsedRealtime() - ch.getBase())/1000;
System.out.println(tempoPassato);
//setto tempo bloccato
if(staticGraphic){
tempoPassato = tempoStatico;
}
System.out.println(tempoPassato);
Intent intent3 = new Intent(ProgressActivity.this, GraphicActivity.class );
intent3.putExtra("beats", mBluetoothLeService.getBeatsTotLocal());//mBluetoothLeService.getBeatsTot()
intent3.putExtra("run", mStarting);
intent3.putExtra("tempo", tempoPassato);
//intent3.putExtra(EXTRAS_DEVICE_ADDRESS, mDeviceAddress);
startActivity(intent3);
}
}
});
}
private void setOnChronometer(){
ch.setOnChronometerTickListener(new OnChronometerTickListener() {
@Override
public void onChronometerTick(Chronometer chronometer) {
long aux = SystemClock.elapsedRealtime() - chronometer.getBase();
hmmss = timeFormat.format(aux);
chronometer.setText(hmmss);
}
});
}
private void setImage(){
if(mActivities!=null){
if(mActivities.getTipoAttivita().equals("run")){
going.setImageResource(R.drawable.going_run);
}
if(mActivities.getTipoAttivita().equals("ride")){
going.setImageResource(R.drawable.going_ride);
}
if(mActivities.getTipoAttivita().equals("gym")){
going.setImageResource(R.drawable.going_gym);
}
}
}
private void startHeart() {
Log.e(TAG, "chiamato StartHeart");
//nuovo if che sostituisce il bottone connect quindi connessione in automatico
if(mDeviceAddress != null && mBluetoothLeService!=null && mBluetoothLeService.getSupportedGattService()!=null){
//ritorna il servizio Heart Rate
BluetoothGattService mBluetoothGattService = mBluetoothLeService.getSupportedGattService();
//richiede la characteristic Heart Rate Measurement caratteristica dei battiti cardiaci
final BluetoothGattCharacteristic characteristic = mBluetoothGattService.getCharacteristic(BluetoothLeService.UUID_HEART_RATE_MEASUREMENT);
final int charaProp = characteristic.getProperties();
if ((charaProp | BluetoothGattCharacteristic.PROPERTY_READ) > 0) {
// If there is an active notification on a characteristic, clear
// it first so it doesn't update the data field on the user interface.
if (mNotifyCharacteristic != null) {
mBluetoothLeService.setCharacteristicNotification(mNotifyCharacteristic, false);
mNotifyCharacteristic = null;
}
mBluetoothLeService.readCharacteristic(characteristic);
}
if ((charaProp | BluetoothGattCharacteristic.PROPERTY_NOTIFY) > 0) {
mNotifyCharacteristic = characteristic;
mBluetoothLeService.setCharacteristicNotification(characteristic, true);
}
}
else{
if(mDeviceAddress != null){
// Start heartRate.
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
startHeart();
}
}, START_HEART);
}
}
}
}